package cn.edu.lingnan.mapper;


import cn.edu.lingnan.user.Statistics.*;
import cn.edu.lingnan.user.pojos.*;
import cn.edu.lingnan.user.vos.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

@Mapper
public interface StatisticsMapper {

    /**
     * 获取所有状态为3（考试结束）的考试ID
     *
     * @return 考试ID列表
     */
    List<Integer> getEndedExamIds();

    /**
     * 获取指定考试中所有状态为2（已提交）的用户考试记录
     *
     * @param examIds 考试ID列表
     * @return 用户考试记录列表
     */
    List<UserExam> getSubmittedUserExams(@Param("examIds") List<Integer> examIds);

    /**
     * 根据题目ID列表获取对应的题目详情
     *
     * @param questionIds 题目ID列表
     * @return 题目详情列表
     */
    List<Question> getQuestionsByIds(@Param("questionIds") List<Integer> questionIds);

    /**
     * 更新用户考试的各项分数和总分
     *
     * @param userExam 用户考试记录
     * @return 影响的行数
     */
    int updateUserExamScores(UserExam userExam);

    /**
     * 获取指定用户的当前答题记录
     * @param examId
     * @param currentId
     * @return
     */
    ExamedPaper getUsersAnswer(Integer examId, Integer currentId);

    PaperSatisticsVo statisticsScore(Integer examId,Integer userId);

    List<QuestionSatisticsVo> statisticsPaeprInfo(Integer paperId);

    /**
     * (a) 获取某考试的平均分、总分、最高分、最低分
     */
    ExamScoreStatsVO getExamScoreStats(@Param("examId") Integer examId);

    /**
     * (b) 获取分数段分布 (0-60, 60-70, 70-80, 80-90, 90-100)
     */
    ScoreDistributionVO getScoreDistribution(@Param("examId") Integer examId);

    /**
     * (c) 获取该考试中分数最高的三条答卷 (同时关联 t_user 查询 userName, nickName)
     */
    List<UserExamScoreVO> getTop3AnswerSheets(@Param("examId") Integer examId);

    /**
     * (d) 获取该考试中分数最低的三条答卷 (同时关联 t_user 查询 userName, nickName)
     */
    List<UserExamScoreVO> getWorst3AnswerSheets(@Param("examId") Integer examId);


    void ReviewExamedPaper(UserExam userExam);

    /**
     * 获取用户统计数据。
     *
     * @param date   统计的日期，格式为 'yyyy-MM-dd'。
     * @param period 统计的周期：day、week、year。
     * @return 用户统计视图对象 VO。
     */
    UserStatisticsVO getUserStatistics(@Param("date") String date, @Param("period") String period);

    @Update("UPDATE tb_exam_system.t_user_exam SET diagnosis = #{diagnosis} WHERE exam_id = #{examId} AND user_id = #{currentId}")
    void saveDiagnosis(Integer examId, Integer currentId, String diagnosis);


    //下面是管理员统计功能


        // 统计平均分排名前三的学生
        List<TopStudentVO> selectTopStudents();

        // 统计所有学生的分数段人数
        List<ScoreRangeVO> selectScoreRanges();

        // 统计成绩最好的三份试卷
        List<ExamPerformanceVO> selectBestExams();

        // 统计成绩最差的三份试卷
        List<ExamPerformanceVO> selectWorstExams();

        // 统计最近一年考试的平均分变化趋势
        List<AverageScoreTrendVO> selectAverageScoreTrend();
}
